Add a last_updated field to every metrics class.
authorEwan Mellor <ewan@xensource.com>
Fri, 23 Mar 2007 13:27:29 +0000 (13:27 +0000)
committerEwan Mellor <ewan@xensource.com>
Fri, 23 Mar 2007 13:27:29 +0000 (13:27 +0000)
Signed-off-by: Ewan Mellor <ewan@xensource.com>
17 files changed:
docs/xen-api/xenapi-datamodel.tex
tools/libxen/include/xen_host_metrics.h
tools/libxen/include/xen_pif_metrics.h
tools/libxen/include/xen_vbd_metrics.h
tools/libxen/include/xen_vif_metrics.h
tools/libxen/include/xen_vm_guest_metrics.h
tools/libxen/include/xen_vm_metrics.h
tools/libxen/src/xen_host_metrics.c
tools/libxen/src/xen_pif_metrics.c
tools/libxen/src/xen_vbd_metrics.c
tools/libxen/src/xen_vif_metrics.c
tools/libxen/src/xen_vm_guest_metrics.c
tools/libxen/src/xen_vm_metrics.c
tools/libxen/test/test_bindings.c
tools/python/xen/xend/XendAPI.py
tools/python/xen/xend/XendPIFMetrics.py
tools/python/xen/xend/XendVMMetrics.py

index 4a11ef0d9bdfa7b2d5aac6fcb52dcfcac9988fa6..4d414e69ba4a44955ab3e5f135d46cbfc0fd475f 100644 (file)
@@ -3983,6 +3983,7 @@ $\mathit{RO}_\mathit{run}$ &  {\tt uuid} & string & unique identifier/object ref
 $\mathit{RO}_\mathit{run}$ &  {\tt memory/actual} & int & Guest's actual memory (bytes) \\
 $\mathit{RO}_\mathit{run}$ &  {\tt VCPUs/number} & int & Current number of VCPUs \\
 $\mathit{RO}_\mathit{run}$ &  {\tt VCPUs/utilisation} & (int $\rightarrow$ float) Map & Utilisation for all of guest's current VCPUs \\
+$\mathit{RO}_\mathit{run}$ &  {\tt last\_updated} & datetime & Time at which this information was last updated \\
 \hline
 \end{longtable}
 \subsection{RPCs associated with class: VM\_metrics}
@@ -4131,6 +4132,38 @@ Get the VCPUs/utilisation field of the given VM\_metrics.
 }
 
 
+value of the field
+\vspace{0.3cm}
+\vspace{0.3cm}
+\vspace{0.3cm}
+\subsubsection{RPC name:~get\_last\_updated}
+
+{\bf Overview:} 
+Get the last\_updated field of the given VM\_metrics.
+
+ \noindent {\bf Signature:} 
+\begin{verbatim} datetime get_last_updated (session_id s, VM_metrics ref self)\end{verbatim}
+
+
+\noindent{\bf Arguments:}
+
+\vspace{0.3cm}
+\begin{tabular}{|c|c|p{7cm}|}
+ \hline
+{\bf type} & {\bf name} & {\bf description} \\ \hline
+{\tt VM\_metrics ref } & self & reference to the object \\ \hline 
+
+\end{tabular}
+
+\vspace{0.3cm}
+
+ \noindent {\bf Return Type:} 
+{\tt 
+datetime
+}
+
+
 value of the field
 \vspace{0.3cm}
 \vspace{0.3cm}
@@ -4219,6 +4252,7 @@ $\mathit{RO}_\mathit{run}$ &  {\tt memory} & (string $\rightarrow$ string) Map &
 $\mathit{RO}_\mathit{run}$ &  {\tt disks} & (string $\rightarrow$ string) Map & disk configuration/free space \\
 $\mathit{RO}_\mathit{run}$ &  {\tt networks} & (string $\rightarrow$ string) Map & network configuration \\
 $\mathit{RO}_\mathit{run}$ &  {\tt other} & (string $\rightarrow$ string) Map & anything else \\
+$\mathit{RO}_\mathit{run}$ &  {\tt last\_updated} & datetime & Time at which this information was last updated \\
 \hline
 \end{longtable}
 \subsection{RPCs associated with class: VM\_guest\_metrics}
@@ -4463,6 +4497,38 @@ Get the other field of the given VM\_guest\_metrics.
 }
 
 
+value of the field
+\vspace{0.3cm}
+\vspace{0.3cm}
+\vspace{0.3cm}
+\subsubsection{RPC name:~get\_last\_updated}
+
+{\bf Overview:} 
+Get the last\_updated field of the given VM\_guest\_metrics.
+
+ \noindent {\bf Signature:} 
+\begin{verbatim} datetime get_last_updated (session_id s, VM_guest_metrics ref self)\end{verbatim}
+
+
+\noindent{\bf Arguments:}
+
+\vspace{0.3cm}
+\begin{tabular}{|c|c|p{7cm}|}
+ \hline
+{\bf type} & {\bf name} & {\bf description} \\ \hline
+{\tt VM\_guest\_metrics ref } & self & reference to the object \\ \hline 
+
+\end{tabular}
+
+\vspace{0.3cm}
+
+ \noindent {\bf Return Type:} 
+{\tt 
+datetime
+}
+
+
 value of the field
 \vspace{0.3cm}
 \vspace{0.3cm}
@@ -5816,6 +5882,7 @@ Quals & Field & Type & Description \\
 $\mathit{RO}_\mathit{run}$ &  {\tt uuid} & string & unique identifier/object reference \\
 $\mathit{RO}_\mathit{run}$ &  {\tt memory/total} & int & Host's total memory (bytes) \\
 $\mathit{RO}_\mathit{run}$ &  {\tt memory/free} & int & Host's free memory (bytes) \\
+$\mathit{RO}_\mathit{run}$ &  {\tt last\_updated} & datetime & Time at which this information was last updated \\
 \hline
 \end{longtable}
 \subsection{RPCs associated with class: host\_metrics}
@@ -5932,6 +5999,38 @@ int
 }
 
 
+value of the field
+\vspace{0.3cm}
+\vspace{0.3cm}
+\vspace{0.3cm}
+\subsubsection{RPC name:~get\_last\_updated}
+
+{\bf Overview:} 
+Get the last\_updated field of the given host\_metrics.
+
+ \noindent {\bf Signature:} 
+\begin{verbatim} datetime get_last_updated (session_id s, host_metrics ref self)\end{verbatim}
+
+
+\noindent{\bf Arguments:}
+
+\vspace{0.3cm}
+\begin{tabular}{|c|c|p{7cm}|}
+ \hline
+{\bf type} & {\bf name} & {\bf description} \\ \hline
+{\tt host\_metrics ref } & self & reference to the object \\ \hline 
+
+\end{tabular}
+
+\vspace{0.3cm}
+
+ \noindent {\bf Return Type:} 
+{\tt 
+datetime
+}
+
+
 value of the field
 \vspace{0.3cm}
 \vspace{0.3cm}
@@ -7745,6 +7844,7 @@ Quals & Field & Type & Description \\
 $\mathit{RO}_\mathit{run}$ &  {\tt uuid} & string & unique identifier/object reference \\
 $\mathit{RO}_\mathit{run}$ &  {\tt io/read\_kbs} & float & Read bandwidth (KiB/s) \\
 $\mathit{RO}_\mathit{run}$ &  {\tt io/write\_kbs} & float & Write bandwidth (KiB/s) \\
+$\mathit{RO}_\mathit{run}$ &  {\tt last\_updated} & datetime & Time at which this information was last updated \\
 \hline
 \end{longtable}
 \subsection{RPCs associated with class: VIF\_metrics}
@@ -7861,6 +7961,38 @@ float
 }
 
 
+value of the field
+\vspace{0.3cm}
+\vspace{0.3cm}
+\vspace{0.3cm}
+\subsubsection{RPC name:~get\_last\_updated}
+
+{\bf Overview:} 
+Get the last\_updated field of the given VIF\_metrics.
+
+ \noindent {\bf Signature:} 
+\begin{verbatim} datetime get_last_updated (session_id s, VIF_metrics ref self)\end{verbatim}
+
+
+\noindent{\bf Arguments:}
+
+\vspace{0.3cm}
+\begin{tabular}{|c|c|p{7cm}|}
+ \hline
+{\bf type} & {\bf name} & {\bf description} \\ \hline
+{\tt VIF\_metrics ref } & self & reference to the object \\ \hline 
+
+\end{tabular}
+
+\vspace{0.3cm}
+
+ \noindent {\bf Return Type:} 
+{\tt 
+datetime
+}
+
+
 value of the field
 \vspace{0.3cm}
 \vspace{0.3cm}
@@ -8522,6 +8654,7 @@ Quals & Field & Type & Description \\
 $\mathit{RO}_\mathit{run}$ &  {\tt uuid} & string & unique identifier/object reference \\
 $\mathit{RO}_\mathit{run}$ &  {\tt io/read\_kbs} & float & Read bandwidth (KiB/s) \\
 $\mathit{RO}_\mathit{run}$ &  {\tt io/write\_kbs} & float & Write bandwidth (KiB/s) \\
+$\mathit{RO}_\mathit{run}$ &  {\tt last\_updated} & datetime & Time at which this information was last updated \\
 \hline
 \end{longtable}
 \subsection{RPCs associated with class: PIF\_metrics}
@@ -8638,6 +8771,38 @@ float
 }
 
 
+value of the field
+\vspace{0.3cm}
+\vspace{0.3cm}
+\vspace{0.3cm}
+\subsubsection{RPC name:~get\_last\_updated}
+
+{\bf Overview:} 
+Get the last\_updated field of the given PIF\_metrics.
+
+ \noindent {\bf Signature:} 
+\begin{verbatim} datetime get_last_updated (session_id s, PIF_metrics ref self)\end{verbatim}
+
+
+\noindent{\bf Arguments:}
+
+\vspace{0.3cm}
+\begin{tabular}{|c|c|p{7cm}|}
+ \hline
+{\bf type} & {\bf name} & {\bf description} \\ \hline
+{\tt PIF\_metrics ref } & self & reference to the object \\ \hline 
+
+\end{tabular}
+
+\vspace{0.3cm}
+
+ \noindent {\bf Return Type:} 
+{\tt 
+datetime
+}
+
+
 value of the field
 \vspace{0.3cm}
 \vspace{0.3cm}
@@ -11293,6 +11458,7 @@ Quals & Field & Type & Description \\
 $\mathit{RO}_\mathit{run}$ &  {\tt uuid} & string & unique identifier/object reference \\
 $\mathit{RO}_\mathit{run}$ &  {\tt io/read\_kbs} & float & Read bandwidth (KiB/s) \\
 $\mathit{RO}_\mathit{run}$ &  {\tt io/write\_kbs} & float & Write bandwidth (KiB/s) \\
+$\mathit{RO}_\mathit{run}$ &  {\tt last\_updated} & datetime & Time at which this information was last updated \\
 \hline
 \end{longtable}
 \subsection{RPCs associated with class: VBD\_metrics}
@@ -11409,6 +11575,38 @@ float
 }
 
 
+value of the field
+\vspace{0.3cm}
+\vspace{0.3cm}
+\vspace{0.3cm}
+\subsubsection{RPC name:~get\_last\_updated}
+
+{\bf Overview:} 
+Get the last\_updated field of the given VBD\_metrics.
+
+ \noindent {\bf Signature:} 
+\begin{verbatim} datetime get_last_updated (session_id s, VBD_metrics ref self)\end{verbatim}
+
+
+\noindent{\bf Arguments:}
+
+\vspace{0.3cm}
+\begin{tabular}{|c|c|p{7cm}|}
+ \hline
+{\bf type} & {\bf name} & {\bf description} \\ \hline
+{\tt VBD\_metrics ref } & self & reference to the object \\ \hline 
+
+\end{tabular}
+
+\vspace{0.3cm}
+
+ \noindent {\bf Return Type:} 
+{\tt 
+datetime
+}
+
+
 value of the field
 \vspace{0.3cm}
 \vspace{0.3cm}
index 31f3123364604565178123f28daed56a96a29260..84121332c79ae10bb181c76f1b322ba97a52a6fc 100644 (file)
@@ -64,6 +64,7 @@ typedef struct xen_host_metrics_record
     char *uuid;
     int64_t memory_total;
     int64_t memory_free;
+    time_t last_updated;
 } xen_host_metrics_record;
 
 /**
@@ -181,6 +182,13 @@ extern bool
 xen_host_metrics_get_memory_free(xen_session *session, int64_t *result, xen_host_metrics host_metrics);
 
 
+/**
+ * Get the last_updated field of the given host_metrics.
+ */
+extern bool
+xen_host_metrics_get_last_updated(xen_session *session, time_t *result, xen_host_metrics host_metrics);
+
+
 /**
  * Return a list of all the host_metrics instances known to the system.
  */
index b8dad22afaabbfa0aec2f052e993a9fc44eac326..970700feb121d7d36264392dcff35a55bbe6cfb4 100644 (file)
@@ -64,6 +64,7 @@ typedef struct xen_pif_metrics_record
     char *uuid;
     double io_read_kbs;
     double io_write_kbs;
+    time_t last_updated;
 } xen_pif_metrics_record;
 
 /**
@@ -180,6 +181,13 @@ extern bool
 xen_pif_metrics_get_io_write_kbs(xen_session *session, double *result, xen_pif_metrics pif_metrics);
 
 
+/**
+ * Get the last_updated field of the given PIF_metrics.
+ */
+extern bool
+xen_pif_metrics_get_last_updated(xen_session *session, time_t *result, xen_pif_metrics pif_metrics);
+
+
 /**
  * Return a list of all the PIF_metrics instances known to the system.
  */
index 3cd507b31e7228102e6c004a6985a1dfae5c94ff..f1aa420a34fd06c0a532491b615dd0cef1dc39f5 100644 (file)
@@ -64,6 +64,7 @@ typedef struct xen_vbd_metrics_record
     char *uuid;
     double io_read_kbs;
     double io_write_kbs;
+    time_t last_updated;
 } xen_vbd_metrics_record;
 
 /**
@@ -180,6 +181,13 @@ extern bool
 xen_vbd_metrics_get_io_write_kbs(xen_session *session, double *result, xen_vbd_metrics vbd_metrics);
 
 
+/**
+ * Get the last_updated field of the given VBD_metrics.
+ */
+extern bool
+xen_vbd_metrics_get_last_updated(xen_session *session, time_t *result, xen_vbd_metrics vbd_metrics);
+
+
 /**
  * Return a list of all the VBD_metrics instances known to the system.
  */
index b5a26f25c6c98689fafb13354e4ef81a9f96f6de..2febab468d2756832f079a81d2aa26bf26e59208 100644 (file)
@@ -64,6 +64,7 @@ typedef struct xen_vif_metrics_record
     char *uuid;
     double io_read_kbs;
     double io_write_kbs;
+    time_t last_updated;
 } xen_vif_metrics_record;
 
 /**
@@ -180,6 +181,13 @@ extern bool
 xen_vif_metrics_get_io_write_kbs(xen_session *session, double *result, xen_vif_metrics vif_metrics);
 
 
+/**
+ * Get the last_updated field of the given VIF_metrics.
+ */
+extern bool
+xen_vif_metrics_get_last_updated(xen_session *session, time_t *result, xen_vif_metrics vif_metrics);
+
+
 /**
  * Return a list of all the VIF_metrics instances known to the system.
  */
index 61b8b5b2b7100ccc07e883ce283f3a204bdb9018..273476452676cada37bf2edc2acbc4ae4195c05a 100644 (file)
@@ -69,6 +69,7 @@ typedef struct xen_vm_guest_metrics_record
     xen_string_string_map *disks;
     xen_string_string_map *networks;
     xen_string_string_map *other;
+    time_t last_updated;
 } xen_vm_guest_metrics_record;
 
 /**
@@ -215,6 +216,13 @@ extern bool
 xen_vm_guest_metrics_get_other(xen_session *session, xen_string_string_map **result, xen_vm_guest_metrics vm_guest_metrics);
 
 
+/**
+ * Get the last_updated field of the given VM_guest_metrics.
+ */
+extern bool
+xen_vm_guest_metrics_get_last_updated(xen_session *session, time_t *result, xen_vm_guest_metrics vm_guest_metrics);
+
+
 /**
  * Return a list of all the VM_guest_metrics instances known to the
  * system.
index b03c4d4e3c34bb3baea03e8a5da1a6fcc0988083..d686a7c99ff9cb99121da7b14a970dcc192c8e54 100644 (file)
@@ -66,6 +66,7 @@ typedef struct xen_vm_metrics_record
     int64_t memory_actual;
     int64_t vcpus_number;
     xen_int_float_map *vcpus_utilisation;
+    time_t last_updated;
 } xen_vm_metrics_record;
 
 /**
@@ -189,6 +190,13 @@ extern bool
 xen_vm_metrics_get_vcpus_utilisation(xen_session *session, xen_int_float_map **result, xen_vm_metrics vm_metrics);
 
 
+/**
+ * Get the last_updated field of the given VM_metrics.
+ */
+extern bool
+xen_vm_metrics_get_last_updated(xen_session *session, time_t *result, xen_vm_metrics vm_metrics);
+
+
 /**
  * Return a list of all the VM_metrics instances known to the system.
  */
index d82994dfd010406ff0e855b8af1254332df31dfc..bc621fbaae2b8ebfe6e0ab9c8877c01fa01be3b0 100644 (file)
@@ -44,7 +44,10 @@ static const struct_member xen_host_metrics_record_struct_members[] =
           .offset = offsetof(xen_host_metrics_record, memory_total) },
         { .key = "memory_free",
           .type = &abstract_type_int,
-          .offset = offsetof(xen_host_metrics_record, memory_free) }
+          .offset = offsetof(xen_host_metrics_record, memory_free) },
+        { .key = "last_updated",
+          .type = &abstract_type_datetime,
+          .offset = offsetof(xen_host_metrics_record, last_updated) }
     };
 
 const abstract_type xen_host_metrics_record_abstract_type_ =
@@ -142,6 +145,22 @@ xen_host_metrics_get_memory_free(xen_session *session, int64_t *result, xen_host
 }
 
 
+bool
+xen_host_metrics_get_last_updated(xen_session *session, time_t *result, xen_host_metrics host_metrics)
+{
+    abstract_value param_values[] =
+        {
+            { .type = &abstract_type_string,
+              .u.string_val = host_metrics }
+        };
+
+    abstract_type result_type = abstract_type_datetime;
+
+    XEN_CALL_("host_metrics.get_last_updated");
+    return session->ok;
+}
+
+
 bool
 xen_host_metrics_get_all(xen_session *session, struct xen_host_metrics_set **result)
 {
index 65e3e22f3b8331029734a1ac07b7b004131812e0..5826001731d4a7381cfa0d2b54bfdc3359329129 100644 (file)
@@ -44,7 +44,10 @@ static const struct_member xen_pif_metrics_record_struct_members[] =
           .offset = offsetof(xen_pif_metrics_record, io_read_kbs) },
         { .key = "io_write_kbs",
           .type = &abstract_type_float,
-          .offset = offsetof(xen_pif_metrics_record, io_write_kbs) }
+          .offset = offsetof(xen_pif_metrics_record, io_write_kbs) },
+        { .key = "last_updated",
+          .type = &abstract_type_datetime,
+          .offset = offsetof(xen_pif_metrics_record, last_updated) }
     };
 
 const abstract_type xen_pif_metrics_record_abstract_type_ =
@@ -142,6 +145,22 @@ xen_pif_metrics_get_io_write_kbs(xen_session *session, double *result, xen_pif_m
 }
 
 
+bool
+xen_pif_metrics_get_last_updated(xen_session *session, time_t *result, xen_pif_metrics pif_metrics)
+{
+    abstract_value param_values[] =
+        {
+            { .type = &abstract_type_string,
+              .u.string_val = pif_metrics }
+        };
+
+    abstract_type result_type = abstract_type_datetime;
+
+    XEN_CALL_("PIF_metrics.get_last_updated");
+    return session->ok;
+}
+
+
 bool
 xen_pif_metrics_get_all(xen_session *session, struct xen_pif_metrics_set **result)
 {
index 985553d5a049590be436e526ead44d6644548c37..f0b221f65e3f15e7114ea45d599ce9348436a00d 100644 (file)
@@ -44,7 +44,10 @@ static const struct_member xen_vbd_metrics_record_struct_members[] =
           .offset = offsetof(xen_vbd_metrics_record, io_read_kbs) },
         { .key = "io_write_kbs",
           .type = &abstract_type_float,
-          .offset = offsetof(xen_vbd_metrics_record, io_write_kbs) }
+          .offset = offsetof(xen_vbd_metrics_record, io_write_kbs) },
+        { .key = "last_updated",
+          .type = &abstract_type_datetime,
+          .offset = offsetof(xen_vbd_metrics_record, last_updated) }
     };
 
 const abstract_type xen_vbd_metrics_record_abstract_type_ =
@@ -142,6 +145,22 @@ xen_vbd_metrics_get_io_write_kbs(xen_session *session, double *result, xen_vbd_m
 }
 
 
+bool
+xen_vbd_metrics_get_last_updated(xen_session *session, time_t *result, xen_vbd_metrics vbd_metrics)
+{
+    abstract_value param_values[] =
+        {
+            { .type = &abstract_type_string,
+              .u.string_val = vbd_metrics }
+        };
+
+    abstract_type result_type = abstract_type_datetime;
+
+    XEN_CALL_("VBD_metrics.get_last_updated");
+    return session->ok;
+}
+
+
 bool
 xen_vbd_metrics_get_all(xen_session *session, struct xen_vbd_metrics_set **result)
 {
index 78707b36f5bd1ff8c690f98be2c764c12921d4e7..b3b2a79f59da1a1116c16527b38118ae242cc53c 100644 (file)
@@ -44,7 +44,10 @@ static const struct_member xen_vif_metrics_record_struct_members[] =
           .offset = offsetof(xen_vif_metrics_record, io_read_kbs) },
         { .key = "io_write_kbs",
           .type = &abstract_type_float,
-          .offset = offsetof(xen_vif_metrics_record, io_write_kbs) }
+          .offset = offsetof(xen_vif_metrics_record, io_write_kbs) },
+        { .key = "last_updated",
+          .type = &abstract_type_datetime,
+          .offset = offsetof(xen_vif_metrics_record, last_updated) }
     };
 
 const abstract_type xen_vif_metrics_record_abstract_type_ =
@@ -142,6 +145,22 @@ xen_vif_metrics_get_io_write_kbs(xen_session *session, double *result, xen_vif_m
 }
 
 
+bool
+xen_vif_metrics_get_last_updated(xen_session *session, time_t *result, xen_vif_metrics vif_metrics)
+{
+    abstract_value param_values[] =
+        {
+            { .type = &abstract_type_string,
+              .u.string_val = vif_metrics }
+        };
+
+    abstract_type result_type = abstract_type_datetime;
+
+    XEN_CALL_("VIF_metrics.get_last_updated");
+    return session->ok;
+}
+
+
 bool
 xen_vif_metrics_get_all(xen_session *session, struct xen_vif_metrics_set **result)
 {
index dd464c4806d168c992944521c08e5e50c48507e6..f18966c46aae1ee1c247e885cddf653dceb2c568 100644 (file)
@@ -57,7 +57,10 @@ static const struct_member xen_vm_guest_metrics_record_struct_members[] =
           .offset = offsetof(xen_vm_guest_metrics_record, networks) },
         { .key = "other",
           .type = &abstract_type_string_string_map,
-          .offset = offsetof(xen_vm_guest_metrics_record, other) }
+          .offset = offsetof(xen_vm_guest_metrics_record, other) },
+        { .key = "last_updated",
+          .type = &abstract_type_datetime,
+          .offset = offsetof(xen_vm_guest_metrics_record, last_updated) }
     };
 
 const abstract_type xen_vm_guest_metrics_record_abstract_type_ =
@@ -231,6 +234,22 @@ xen_vm_guest_metrics_get_other(xen_session *session, xen_string_string_map **res
 }
 
 
+bool
+xen_vm_guest_metrics_get_last_updated(xen_session *session, time_t *result, xen_vm_guest_metrics vm_guest_metrics)
+{
+    abstract_value param_values[] =
+        {
+            { .type = &abstract_type_string,
+              .u.string_val = vm_guest_metrics }
+        };
+
+    abstract_type result_type = abstract_type_datetime;
+
+    XEN_CALL_("VM_guest_metrics.get_last_updated");
+    return session->ok;
+}
+
+
 bool
 xen_vm_guest_metrics_get_all(xen_session *session, struct xen_vm_guest_metrics_set **result)
 {
index 9bafa83aa050452fa519bd969e229a765ec2d662..ae20899e06cd4e3fa075380ad4e9d95c739caf40 100644 (file)
@@ -48,7 +48,10 @@ static const struct_member xen_vm_metrics_record_struct_members[] =
           .offset = offsetof(xen_vm_metrics_record, vcpus_number) },
         { .key = "VCPUs_utilisation",
           .type = &abstract_type_int_float_map,
-          .offset = offsetof(xen_vm_metrics_record, vcpus_utilisation) }
+          .offset = offsetof(xen_vm_metrics_record, vcpus_utilisation) },
+        { .key = "last_updated",
+          .type = &abstract_type_datetime,
+          .offset = offsetof(xen_vm_metrics_record, last_updated) }
     };
 
 const abstract_type xen_vm_metrics_record_abstract_type_ =
@@ -164,6 +167,22 @@ xen_vm_metrics_get_vcpus_utilisation(xen_session *session, xen_int_float_map **r
 }
 
 
+bool
+xen_vm_metrics_get_last_updated(xen_session *session, time_t *result, xen_vm_metrics vm_metrics)
+{
+    abstract_value param_values[] =
+        {
+            { .type = &abstract_type_string,
+              .u.string_val = vm_metrics }
+        };
+
+    abstract_type result_type = abstract_type_datetime;
+
+    XEN_CALL_("VM_metrics.get_last_updated");
+    return session->ok;
+}
+
+
 bool
 xen_vm_metrics_get_all(xen_session *session, struct xen_vm_metrics_set **result)
 {
index 1471814d81165f69d87e0e3a31abbd8e98c147b5..c709e64867b341b08c935a7d7661d78d21e8a2ae 100644 (file)
@@ -592,6 +592,11 @@ static void print_vm_metrics(xen_session *session, xen_vm vm)
         return;
     }
 
+    char time[256];
+    struct tm *tm = localtime(&vm_metrics_record->last_updated);
+    strftime(time, 256, "Metrics updated at %c, local time.\n", tm);
+    printf(time);
+
     for (size_t i = 0; i < vm_metrics_record->vcpus_utilisation->size; i++)
     {
         printf("%"PRId64" -> %lf.\n",
index 4c2ba32ae03dc97858a984a19e417121186b4c84..e2a0a78b60cff4fdc2b33246f288b1bf1d57fc2c 100644 (file)
@@ -21,6 +21,8 @@ import string
 import sys
 import traceback
 import threading
+import time
+import xmlrpclib
 
 from xen.xend import XendDomain, XendDomainInfo, XendNode, XendDmesg
 from xen.xend import XendLogging, XendTaskManager
@@ -77,6 +79,11 @@ def xen_api_todo():
     """Temporary method to make sure we track down all the TODOs"""
     return {"Status": "Error", "ErrorDescription": XEND_ERROR_TODO}
 
+
+def now():
+    return xmlrpclib.DateTime(time.strftime("%Y%m%dT%H:%M:%S", time.gmtime()))
+
+
 # ---------------------------------------------------
 # Python Method Decorators for input value validation
 # ---------------------------------------------------
@@ -850,7 +857,8 @@ class XendAPI(object):
     # ----------------------------------------------------------------
 
     host_metrics_attr_ro = ['memory_total',
-                            'memory_free']
+                            'memory_free',
+                            'last_updated']
     host_metrics_attr_rw = []
     host_metrics_methods = []
 
@@ -865,14 +873,18 @@ class XendAPI(object):
             'uuid'         : ref,
             'memory_total' : self._host_metrics_get_memory_total(),
             'memory_free'  : self._host_metrics_get_memory_free(),
+            'last_updated' : now(),
             })
 
-    def host_metrics_get_memory_total(self, _, ref):
+    def host_metrics_get_memory_total(self, _1, _2):
         return xen_api_success(self._host_metrics_get_memory_total())
 
-    def host_metrics_get_memory_free(self, _, ref):
+    def host_metrics_get_memory_free(self, _1, _2):
         return xen_api_success(self._host_metrics_get_memory_free())
 
+    def host_metrics_get_last_updated(self, _1, _2):
+        return xen_api_success(now())
+
     def _host_metrics_get_memory_total(self):
         node = XendNode.instance()
         return node.xc.physinfo()['total_memory'] * 1024
@@ -1012,7 +1024,8 @@ class XendAPI(object):
     # ----------------------------------------------------------------
 
     PIF_metrics_attr_ro = ['io_read_kbs',
-                           'io_write_kbs']
+                           'io_write_kbs',
+                           'last_updated']
     PIF_metrics_attr_rw = []
     PIF_methods = []
 
@@ -1031,6 +1044,9 @@ class XendAPI(object):
     def PIF_metrics_get_io_write_kbs(self, _, ref):
         return xen_api_success(self._PIF_metrics_get(ref).get_io_write_kbs())
 
+    def PIF_metrics_get_last_updated(self, _1, _2):
+        return xen_api_success(now())
+
 
     # Xen API: Class VM
     # ----------------------------------------------------------------        
@@ -1609,7 +1625,8 @@ class XendAPI(object):
                           'VCPUs_flags',
                           'VCPUs_params',
                           'state',
-                          'start_time']
+                          'start_time',
+                          'last_updated']
     VM_metrics_attr_rw = []
     VM_metrics_methods = []
 
@@ -1646,6 +1663,9 @@ class XendAPI(object):
     def VM_metrics_get_state(self, _, ref):
         return xen_api_success(self._VM_metrics_get(ref).get_state())
 
+    def VM_metrics_get_last_updated(self, _1, _2):
+        return xen_api_success(now())
+
 
     # Xen API: Class VBD
     # ----------------------------------------------------------------
@@ -1800,7 +1820,8 @@ class XendAPI(object):
     # ----------------------------------------------------------------
 
     VBD_metrics_attr_ro = ['io_read_kbs',
-                           'io_write_kbs']
+                           'io_write_kbs',
+                           'last_updated']
     VBD_metrics_attr_rw = []
     VBD_methods = []
 
@@ -1810,7 +1831,9 @@ class XendAPI(object):
             return xen_api_error(['HANDLE_INVALID', 'VBD_metrics', ref])
         return xen_api_success(
             { 'io_read_kbs'  : vm.get_dev_property('vbd', ref, 'io_read_kbs'),
-              'io_write_kbs' : vm.get_dev_property('vbd', ref, 'io_write_kbs') })
+              'io_write_kbs' : vm.get_dev_property('vbd', ref, 'io_write_kbs'),
+              'last_updated' : now()
+            })
 
     def VBD_metrics_get_io_read_kbs(self, _, ref):
         return self._VBD_get(ref, 'io_read_kbs')
@@ -1818,6 +1841,9 @@ class XendAPI(object):
     def VBD_metrics_get_io_write_kbs(self, session, ref):
         return self._VBD_get(ref, 'io_write_kbs')
 
+    def VBD_metrics_get_last_updated(self, _1, _2):
+        return xen_api_success(now())
+
 
     # Xen API: Class VIF
     # ----------------------------------------------------------------
@@ -1934,7 +1960,8 @@ class XendAPI(object):
     # ----------------------------------------------------------------
 
     VIF_metrics_attr_ro = ['io_read_kbs',
-                           'io_write_kbs']
+                           'io_write_kbs',
+                           'last_updated']
     VIF_metrics_attr_rw = []
     VIF_methods = []
 
@@ -1944,7 +1971,9 @@ class XendAPI(object):
             return xen_api_error(['HANDLE_INVALID', 'VIF_metrics', ref])
         return xen_api_success(
             { 'io_read_kbs'  : vm.get_dev_property('vif', ref, 'io_read_kbs'),
-              'io_write_kbs' : vm.get_dev_property('vif', ref, 'io_write_kbs') })
+              'io_write_kbs' : vm.get_dev_property('vif', ref, 'io_write_kbs'),
+              'last_updated' : now()
+            })
 
     def VIF_metrics_get_io_read_kbs(self, _, ref):
         return self._VIF_get(ref, 'io_read_kbs')
@@ -1952,6 +1981,9 @@ class XendAPI(object):
     def VIF_metrics_get_io_write_kbs(self, session, ref):
         return self._VIF_get(ref, 'io_write_kbs')
 
+    def VIF_metrics_get_last_updated(self, _1, _2):
+        return xen_api_success(now())
+
 
     # Xen API: Class VDI
     # ----------------------------------------------------------------
@@ -2424,39 +2456,3 @@ class XendAPIAsyncProxy:
                                                 synchronous_method_name,
                                                 session)
         return xen_api_success(task_uuid)
-
-#   
-# Auto generate some stubs based on XendAPI introspection
-#
-if __name__ == "__main__":
-    def output(line):
-        print '    ' + line
-    
-    classes = ['VDI', 'SR']
-    for cls in classes:
-        ro_attrs = getattr(XendAPI, '%s_attr_ro' % cls, [])
-        rw_attrs = getattr(XendAPI, '%s_attr_rw' % cls, [])
-        methods  = getattr(XendAPI, '%s_methods' % cls, [])
-        funcs    = getattr(XendAPI, '%s_funcs' % cls, [])
-
-        ref = '%s_ref' % cls
-
-        for attr_name in ro_attrs + rw_attrs + XendAPI.Base_attr_ro:
-            getter_name = '%s_get_%s' % (cls, attr_name)
-            output('def %s(self, session, %s):' % (getter_name, ref))
-            output('    return xen_api_todo()')
-
-        for attr_name in rw_attrs + XendAPI.Base_attr_rw:
-            setter_name = '%s_set_%s' % (cls, attr_name)
-            output('def %s(self, session, %s, value):' % (setter_name, ref))
-            output('    return xen_api_todo()')
-
-        for method_name in methods + XendAPI.Base_methods:
-            method_full_name = '%s_%s' % (cls,method_name)
-            output('def %s(self, session, %s):' % (method_full_name, ref))
-            output('    return xen_api_todo()')
-
-        for func_name in funcs + XendAPI.Base_funcs:
-            func_full_name = '%s_%s' % (cls, func_name)
-            output('def %s(self, session):' % func_full_name)
-            output('    return xen_api_todo()')
index 8c6525166440a40862c950cac070c230b68c9207..36a1e582f4a6c67bdc43d4ddb952235f8d86a428 100644 (file)
@@ -40,8 +40,10 @@ class XendPIFMetrics:
         return 0.0
 
     def get_record(self):
+        import xen.xend.XendAPI as XendAPI
         return {'uuid'         : self.uuid,
                 'PIF'          : self.pif.uuid,
                 'io_read_kbs'  : self.get_io_read_kbs(),
-                'io_write_kbs' : self.get_io_write_kbs()
+                'io_write_kbs' : self.get_io_write_kbs(),
+                'last_updated' : XendAPI.now(),
                 }
index 2ba328a5cd6128436c423f080b73d5807c474b04..9daee212cea0f9daeb93919c2708e2ebf5cdb869 100644 (file)
@@ -141,6 +141,7 @@ class XendVMMetrics:
         return self.xend_domain_instance.info.get("start_time", -1)
     
     def get_record(self):
+        import xen.xend.XendAPI as XendAPI
         return { 'uuid'              : self.uuid,
                  'memory_actual'     : self.get_memory_actual(),
                  'VCPUs_number'      : self.get_VCPUs_number(),
@@ -150,4 +151,5 @@ class XendVMMetrics:
                  'VCPUs_params'      : self.get_VCPUs_params(),
                  'start_time'        : self.get_start_time(),
                  'state'             : self.get_state(),
+                 'last_updated'      : XendAPI.now(),
                }